YES 1.113 H-Termination proof of /home/matraf/haskell/eval_FullyBlown_Fast/List.hs
H-Termination of the given Haskell-Program with start terms could successfully be proven:



HASKELL
  ↳ BR

mainModule List
  ((genericIndex :: [a ->  Int  ->  a) :: [a ->  Int  ->  a)

module List where
  import qualified Maybe
import qualified Prelude

  genericIndex :: Integral b => [a ->  b  ->  a
genericIndex (x : _) 0 x
genericIndex (_ : xsn 
 | n > 0 = 
genericIndex xs (n - 1)
 | otherwise = 
error []
genericIndex _ _ error []


module Maybe where
  import qualified List
import qualified Prelude



Replaced joker patterns by fresh variables and removed binding patterns.

↳ HASKELL
  ↳ BR
HASKELL
      ↳ COR

mainModule List
  ((genericIndex :: [a ->  Int  ->  a) :: [a ->  Int  ->  a)

module List where
  import qualified Maybe
import qualified Prelude

  genericIndex :: Integral b => [a ->  b  ->  a
genericIndex (x : vw) 0 x
genericIndex (vx : xsn 
 | n > 0 = 
genericIndex xs (n - 1)
 | otherwise = 
error []
genericIndex vy vz error []


module Maybe where
  import qualified List
import qualified Prelude



Cond Reductions:
The following Function with conditions
genericIndex (x : vw) 0 = x
genericIndex (vx : xsn
 | n > 0
 = genericIndex xs (n - 1)
 | otherwise
 = error []
genericIndex vy vz = error []

is transformed to
genericIndex (x : vwyy = genericIndex5 (x : vwyy
genericIndex (vx : xsn = genericIndex3 (vx : xsn
genericIndex vy vz = genericIndex0 vy vz

genericIndex0 vy vz = error []

genericIndex2 vx xs n True = genericIndex xs (n - 1)
genericIndex2 vx xs n False = genericIndex1 vx xs n otherwise

genericIndex1 vx xs n True = error []
genericIndex1 vx xs n False = genericIndex0 (vx : xsn

genericIndex3 (vx : xsn = genericIndex2 vx xs n (n > 0)
genericIndex3 yv yw = genericIndex0 yv yw

genericIndex4 True (x : vwyy = x
genericIndex4 yz zu zv = genericIndex3 zu zv

genericIndex5 (x : vwyy = genericIndex4 (yy == 0) (x : vwyy
genericIndex5 zw zx = genericIndex3 zw zx

The following Function with conditions
undefined 
 | False
 = undefined

is transformed to
undefined  = undefined1

undefined0 True = undefined

undefined1  = undefined0 False



↳ HASKELL
  ↳ BR
    ↳ HASKELL
      ↳ COR
HASKELL
          ↳ NumRed

mainModule List
  ((genericIndex :: [a ->  Int  ->  a) :: [a ->  Int  ->  a)

module List where
  import qualified Maybe
import qualified Prelude

  genericIndex :: Integral a => [b ->  a  ->  b
genericIndex (x : vwyy genericIndex5 (x : vw) yy
genericIndex (vx : xsn genericIndex3 (vx : xs) n
genericIndex vy vz genericIndex0 vy vz

  
genericIndex0 vy vz error []

  
genericIndex1 vx xs n True error []
genericIndex1 vx xs n False genericIndex0 (vx : xs) n

  
genericIndex2 vx xs n True genericIndex xs (n - 1)
genericIndex2 vx xs n False genericIndex1 vx xs n otherwise

  
genericIndex3 (vx : xsn genericIndex2 vx xs n (n > 0)
genericIndex3 yv yw genericIndex0 yv yw

  
genericIndex4 True (x : vwyy x
genericIndex4 yz zu zv genericIndex3 zu zv

  
genericIndex5 (x : vwyy genericIndex4 (yy == 0) (x : vw) yy
genericIndex5 zw zx genericIndex3 zw zx


module Maybe where
  import qualified List
import qualified Prelude



Num Reduction: All numbers are transformed to thier corresponding representation with Pos, Neg, Succ and Zero.

↳ HASKELL
  ↳ BR
    ↳ HASKELL
      ↳ COR
        ↳ HASKELL
          ↳ NumRed
HASKELL
              ↳ Narrow

mainModule List
  (genericIndex :: [a ->  Int  ->  a)

module List where
  import qualified Maybe
import qualified Prelude

  genericIndex :: Integral b => [a ->  b  ->  a
genericIndex (x : vwyy genericIndex5 (x : vw) yy
genericIndex (vx : xsn genericIndex3 (vx : xs) n
genericIndex vy vz genericIndex0 vy vz

  
genericIndex0 vy vz error []

  
genericIndex1 vx xs n True error []
genericIndex1 vx xs n False genericIndex0 (vx : xs) n

  
genericIndex2 vx xs n True genericIndex xs (n - fromInt (Pos (Succ Zero)))
genericIndex2 vx xs n False genericIndex1 vx xs n otherwise

  
genericIndex3 (vx : xsn genericIndex2 vx xs n (n > fromInt (Pos Zero))
genericIndex3 yv yw genericIndex0 yv yw

  
genericIndex4 True (x : vwyy x
genericIndex4 yz zu zv genericIndex3 zu zv

  
genericIndex5 (x : vwyy genericIndex4 (yy == fromInt (Pos Zero)) (x : vw) yy
genericIndex5 zw zx genericIndex3 zw zx


module Maybe where
  import qualified List
import qualified Prelude



Haskell To QDPs


↳ HASKELL
  ↳ BR
    ↳ HASKELL
      ↳ COR
        ↳ HASKELL
          ↳ NumRed
            ↳ HASKELL
              ↳ Narrow
QDP
                  ↳ QDPSizeChangeProof

Q DP problem:
The TRS P consists of the following rules:

new_genericIndex(:(zy30, zy31), Pos(Succ(zy400)), ba) → new_genericIndex(zy31, new_primMinusNat(zy400), ba)

The TRS R consists of the following rules:

new_primMinusNat(Succ(zy4000)) → Pos(Succ(zy4000))
new_primMinusNat(Zero) → Pos(Zero)

The set Q consists of the following terms:

new_primMinusNat(Zero)
new_primMinusNat(Succ(x0))

We have to consider all minimal (P,Q,R)-chains.
By using the subterm criterion [20] together with the size-change analysis [32] we have proven that there are no infinite chains for this DP problem.

From the DPs we obtained the following set of size-change graphs: